########################################################################################
##  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING THIS SOFTWARE
##
##  By downloading, copying, installing or using the software you agree to this license.
##  If you do not agree to this license, do not download, install, copy or use the software.
##
## Copyright (C) 2013, AerVision Technologies Pty Ltd, all rights reserved.
##
## Redistribution and use in source and binary forms, with or without modification,
## are permitted provided that the following conditions are met:
##
##   * Redistribution's of source code must retain the above copyright notice,
##     this list of conditions and the following disclaimer.
##
##   * Redistribution's in binary form must reproduce the above copyright notice,
##     this list of conditions and the following disclaimer in the documentation
##     and/or other materials provided with the distribution.
##
##   * The name of AerVision Technologies, may not be used to endorse or promote products
##     derived from this software without specific prior written permission.
##
## This software is provided by the copyright holders and contributors to demonstrate 
## www.AerCloud.net Framework as a Service API (FaaS), "as is" and
## any express or implied warranties, including, but not limited to, the implied
## warranties of merchantability and fitness for a particular purpose are disclaimed.
## In no event shall the copyright holder or contributors be liable for any direct,
## indirect, incidental, special, exemplary, or consequential damages
## (including, but not limited to, procurement of substitute goods or services;
## loss of use, data, or profits; or business interruption) however caused
## and on any theory of liability, whether in contract, strict liability,
## or tort (including negligence or otherwise) arising in any way out of
## the use of this software, even if advised of the possibility of such damage.
########################################################################################

import base64
import os

from logging import getLogger
from StringIO import StringIO

from PIL import Image, ImageTk

logging = getLogger(__name__)

class ImageData:
    image_data = None
    ext = ""
    format = ""
    
    def __init__(self, fileName=None, data=None, image=None):
        if fileName != None:
            self.ext = os.path.splitext(fileName)[1].lower()
            
            self.format = self.ext[1:]
            
            if self.ext == ".png" or self.ext == ".jpg" or self.ext == ".jpeg":
                with open(fileName, "rb") as f:
                    self.image_data = f.read()
            else:
                logging.error("Error> Invalid file extension: " + fileName)
        elif data != None:
            self.image_data = data
        elif image != None:
            self.image = image
            buf = StringIO()
            image.save(buf, format='PNG', mode='BGRA')
            self.image_data = buf.getvalue()
            
    def asPng(self):
        buf = StringIO(self.image_data)
        img = Image.open(buf)
        buf = StringIO()
        img.save(buf, format='PNG')
        return buf.getvalue()
        
    def asImage(self):
        buf = StringIO(self.image_data)
        img = Image.open(buf)
        return img
    
    def asBase64(self):
        return base64.b64encode(self.image_data)
    
    def asThumbnail(self, w=128, h=128):
        buf = StringIO(self.asPng())
        img = Image.open(buf)
        iw, ih = img.size
        r = min(w*1.0/iw, h*1.0/ih)
        size = (int(r*iw), int(r*ih))
        resized = img.resize(size, Image.ANTIALIAS)
        return ImageTk.PhotoImage(resized)
